package com.wlf.core.proxy;

import com.wlf.core.RpcApplication;

import java.lang.reflect.Proxy;

/**
 * 服务代理工厂（用于创建代理对象）
 */
public class ServiceProxyFactory {

    /**
     * 根据服务类获取代理对象
     *
     * @param serviceClass
     * @param <T>
     * @return
     */
    public static <T> T getProxy(Class<T> serviceClass) {
/**
 * 三个参数的作用
 * 1.用于指定用哪个类加载器，去加载生成的代理类
 * 2.被代理对象实现的所有的接口的字节码数组（可以有多个接口）
 * 3.实例化InvocationHandler()InvocationHandler接口的类或匿名内部类，重写其invoke方法以定义具体的行为
 */
        if (RpcApplication.getRpcConfig().isMock()) {
            return getMockProxy(serviceClass);
        }
        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass},
                new ServiceProxy());
    }

    public static <T> T getMockProxy(Class<T> serviceClass) {

        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass},
                new MockProxy());
    }

}
